<?php 
header("Content-type: text/html; charset=utf-8");

require_once('auth_i.inc.php');

require_once('pdkparse.inc.php');

$show_info = "";

if (!empty($_FILES) && ($_FILES['file']['error'] == 0) && (is_uploaded_file($_FILES['file']['tmp_name'])))
{
    $info = parse_pdk_file($_FILES['file']['tmp_name']);
}

if (isset($_POST['action']))
{
    switch ($_POST['action'])
    {
        case '_add':

            if (!isset($info))
            {
                $show_info = 'Контроллер не добавлен:\nНеправильный или не задан файл программы.';
                break;
            }

            $sts = $dbh->prepare('select count(*) as count from network_map where c_id=:cid');
        
                if ($sts->execute(array('cid' => $info['c_num'])))
                {
                    if ($res = $sts->fetchAll())
                    {
                        if ($res[0]['count'] > 0)
                        {
                    $show_info = 'Контроллер не добавлен:\nКонтроллер с номером:'. $info['c_num'] .' уже есть в сети.';
                    break;
                        }
                    }    
                }

            $sth = $dbh->prepare('insert into network_map ' .
                '(c_id, g_id, location, enc_key, next_enc_key, program, prog_load_time, prog_update_status)'.
                ' values (:cid, :gid, :location, :key, :key, :program, NOW(), 0)');

            $sth->bindParam(':cid',intval($info['c_num']), PDO::PARAM_INT);
            $sth->bindParam(':key',$info['key']);
            $sth->bindParam(':program',$info['program']);
            $sth->bindParam(':gid',intval($_POST['group']), PDO::PARAM_INT);
            $sth->bindParam(':location', $_POST['location']);

            if ($sth->execute())
            {
                $show_info = 'Добавлен контроллер номер: ' . $info['c_num'] . '\nКлюч: ' . $info['key'];
            }
            else
            {
                $err_arr = $sth->errorInfo();
                $show_info = 'Контроллер не добавлен:' . $err_arr[2];
            }

        break;
        
        case '_edit':

            if (!isset($info))
            {
                $sth = $dbh->prepare('update network_map set g_id=:gid, location=:location where c_id = :cid');

                $sth->bindParam(':cid',intval($_POST['c_id']), PDO::PARAM_INT);
                $sth->bindParam(':gid',intval($_POST['group']), PDO::PARAM_INT);
                $sth->bindParam(':location', $_POST['location']);

                if ($sth->execute())
                {
                $show_info = '';
                }
                else
                {
                $err_arr = $sth->errorInfo();
                $show_info = 'Ошибка при изменении контроллера:' . $err_arr[2];
                }
            
                break;
            }
            
            if ($info['c_num'] != $_POST['c_id'])
            {
                $show_info = 'Контроллер не может быть отредактирован:\nНомер контроллера в программе '.$info['cnum'].'не соответсвует номеру контроллера: ' . $_POST['c_id'];
                break;
            }

            $sth = $dbh->prepare('update network_map set g_id=:gid, location=:location, next_enc_key=:key, '.
                        'program=:program, prog_update_status=0, prog_load_time=NOW() '.
                        'where c_id = :cid');

            $sth->bindParam(':cid',intval($info['c_num']), PDO::PARAM_INT);
            $sth->bindParam(':key',$info['key']);
            $sth->bindParam(':program',$info['program']);
            $sth->bindParam(':gid',intval($_POST['group']), PDO::PARAM_INT);
            $sth->bindParam(':location', $_POST['location']);

            if ($sth->execute())
            {
                $show_info = 'Контроллер номер: ' . $info['c_num'] . 'изменен! \nКлюч: ' . $info['key'];
            }
            else
            {
                $err_arr = $sth->errorInfo();
                $show_info = 'Ошибка при изменении контроллера:' . $err_arr[2];
            }

        break;

    }
}

?>

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=8" />
    <link rel="stylesheet" type="text/css" media="screen" href="css/themes/redmond/jquery-ui-1.8.9.custom.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="css/ui.jqgrid.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="css/ui.multiselect.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="css/asud.css" />

    <script src="js/jquery-1.4.2.min.js" type="text/javascript"></script>
    <script src="js/i18n/grid.locale-ru.js" type="text/javascript"></script>
    <script src="js/jquery.jqGrid.min.js" type="text/javascript"></script>
    <script src="js/jquery-ui-1.8.9.custom.min.js" type="text/javascript"></script>

<script type="text/javascript">

function mysqlTimeStampToDate(timestamp) {
    //function parses mysql datetime string and returns javascript Date object
    //input has to be in this format: 2007-06-05 15:26:02
    var regex=/^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;
    var parts=timestamp.replace(regex,"$1 $2 $3 $4 $5 $6").split(' ');
    return new Date(parts[0],parts[1]-1,parts[2],parts[3],parts[4],parts[5]);
}

function lz(_val)
{
  return (parseInt(_val, 10) < 10) ? ( '0'+_val ) : _val;
}

function set_data(id)
{
        $.getJSON('req/con_rule.php?oper=info&cid='+id, 
                function (data)
                {

                    $("[name=cont_id]").val(id);

                    $('#next-key').html(data['next_enc_key'] );

                    try
                    {
                        var date_load = mysqlTimeStampToDate(data['prog_load_time']);
                        $('#load-date').html(lz(date_load.getDate())+'.'+lz(date_load.getMonth())+'.'+date_load.getFullYear()+' '+
                                              lz(date_load.getHours())+':'+lz(date_load.getMinutes())+':'+lz(date_load.getSeconds()));
                    }
                    catch(e)
                    {
                        $('#load-date').html("");
                    }

                    try
                    {
                        var date_active = mysqlTimeStampToDate(data['prog_update_time']);
                        $('#active-date').html(lz(date_active.getDate())+'.'+lz(date_active.getMonth())+'.'+date_active.getFullYear()+' '+
                                              lz(date_active.getHours())+':'+lz(date_active.getMinutes())+':'+lz(date_active.getSeconds()));
                    }
                    catch(e)
                    {
                        $('#active-date').html("");
                    }

                    $('#cur-key').html(data['enc_key']);

                    $('#prev-key').html(data['prev_enc_key']);

                    if (data['prog_update_status'] == null)
                    {
                        $('#con-state').html('<span style="color:red">Неизвестное состояние !</span>');
                    } 
                    else if(data['prog_update_status'] == 0)
                    {
                        $('#con-state').html('Программа загружена в базу.');
                    }
                    else if(data['prog_update_status'] == 1)
                    {
                        $('#con-state').html('<span style="color:red">Программа загружается.</span>');
                    }
                    else if(data['prog_update_status'] == 3)
                    {
                        $('#con-state').html('Программа загружена в контроллер.');
                    }
                    else if(data['prog_update_status'] == 4)
                    {
                        $('#con-state').html('<span style="color:red">Не удалось загрузить программу !</span>');
                    }
                    else
                    {
                        $('#con-state').html('<span style="color:red">Неизвестное состояние !</span>');
                    }

                    $("#load-button").button({disabled: false});

                    $("#set-phase-button").button({disabled: false});

                    $("#set-prog-button").button({disabled: false});

                    $("#set-time-button").button({disabled: false})

                }
        )
}


$(function() { 
  $("#list").jqGrid({
    url:'req/con_list.php',
    editurl: 'req/con_edit.php',
    datatype: 'json',
    mtype: 'GET',
    width: 500,
    colNames:['Номер','Группа', 'Расположение'],
    colModel :[ 
      {name:'c_id', index:'c_id', width:50, align: 'right'}, 
      {name:'g_name', index:'g_name', editable: true, edittype: 'select', editoptions: {dataUrl:'req/grp_opt.php?type=opt'}}, 
      {name:'location', index:'c_location', width: 185, editable: true}, 
    ],
    sortname: 'c_id',
    sortorder: 'desc',
    viewrecords: true,

    onSelectRow: function(id)
    { 
        var c_id = $("#list").getCell(id, 0); 
        set_data(c_id);

    }
  });

$( "#set-phase" ).dialog({
            autoOpen: false,
            height: 120,
            width: 370,
            modal: true,
            resizable: false,

            buttons: {
                "Ok": function() 
                {
                        $( this ).dialog( "close" );

                        var param = $("[name=phase]").val();
                        var c_id = $("[name=cont_id]").val(); 

                        $.get('req/con_rule.php?oper=cmd&cid='+c_id+'&cmd=phase&param='+param,
                        function(data)
                        {
                            if (data['error'] != null)
                            {
                                alert("Ошибка установки фазы: " + data['error']);
                            }
                            else
                            {
                                alert("Фаза установлена !");
                            }
                        }
                        )

                },
                Cancel: function() {
                    $( this ).dialog( "close" );
                }
            },
});

$( "#set-program" ).dialog({
            autoOpen: false,
            height: 120,
            width: 370,
            modal: true,
            resizable: false,

            buttons: {
                "Ok": function() 
                {
                        $( this ).dialog( "close" );

                        var param = $("[name=program]").val();
                        var c_id = $("[name=cont_id]").val(); 

                        $.get('req/con_rule.php?oper=cmd&cid='+c_id+'&cmd=sprog&param='+param,
                        function(data)
                        {
                            if (data['error'] != null)
                            {
                                alert("Ошибка установки программу: " + data['error']);
                            }
                            else
                            {
                                alert("Программа установлена !");
                            }
                        }
                        )

                },
                Cancel: function() {
                    $( this ).dialog( "close" );
                }
            },
});


$( "#add-form" ).dialog({
            autoOpen: false,
            height: 224,
            width: 413,
            modal: true,
            resizable: false,

            open: function (event, ui)
            {
                $('#group').load('req/grp_opt.php?type=opt', 
                    function (data)
                    {
                        $('#group').html(data);
                    }
                
                );  
            },
            buttons: {
                "Ok": function() {
                    var bValid = true;

                    $('#post-form').submit();

                },
                Cancel: function() {
                    $( this ).dialog( "close" );
                }
            },
    });

$( "#add-button" )
            .button()
            .click(function() {
                $("[name=action]").val('_add');
                $("[name=location]").val('');   

                $( "#add-form" ).dialog("open");
            });

$( "#edit-button" )
            .button()
            .click(function() 
            {
                var gr = jQuery("#list").jqGrid('getGridParam','selrow'); 

                if( gr != null ) 
                {
                    jQuery("#list").jqGrid('GridToForm',gr,'#add-form'); 
                    $("[name=action]").val('_edit');

                    $("#add-form" ).dialog({title:"Изменить параметры"});
                    $("#add-form" ).dialog("open");
                }
                else 
                    alert("Выберите строку для редактирования !"); 
            });

$( "#remove-button" )
            .button()
            .click(function() {
                var gr = $("#list").jqGrid('getGridParam','selrow'); 
                if( gr != null ) 
                {
                    $("#list").jqGrid('delGridRow',gr,{reloadAfterSubmit:true}); 
                }
                else 
                {
                    alert("Выбирете строку для удаления !"); 
                }

            });

$("#load-button")
            .button({disabled: true})
            .click(function() {

                var c_id = $("[name=cont_id]").val();; 

                if (c_id != null)
                {
                    if (confirm("Загрузить программу в контроллер: "+c_id+" ?"))
                    {
                        $.get('req/con_rule.php?oper=cmd&cid='+c_id+'&cmd=pload',
                        function(data)
                        {
                            if (data['error'] != null)
                            {
                                alert("Ошибка загрузки программы: " + data['error']);
                            }
                            else
                            {
                                alert("Загрузка программы стартовала !");
                            }
                        }
                        )
                    }
                }
            });

$("#set-phase-button")
            .button({disabled: true})
            .click(function() {
                $( "#set-phase" ).dialog("open");
            });

$("#set-prog-button")
            .button({disabled: true})
            .click(function() {
                $( "#set-program" ).dialog("open");
            });

$("#set-time-button")
            .button({disabled: true})
            .click(function() {
                var c_id = $("[name=cont_id]").val();; 

                if (c_id != null)
                {
                    if (confirm("Синхронизировать с сервером время в контроллере: "+c_id+" ?"))
                    {
                        $.get('req/con_rule.php?oper=cmd&cid='+c_id+'&cmd=stime',
                        function(data)
                        {
                            if (data['error'] != null)
                            {
                                alert("Ошибка синхронизации времени: " + data['error']);
                            }
                            else
                            {
                                alert("Сихронизация времени стартовала !");
                            }
                        }
                        )
                    }
                }

            });


<?php
    if (!empty($show_info))
    {
        echo 'alert("'. $show_info .'");'; 
    }
?>

setInterval(function()
{
    var c_id = $("[name=cont_id]").val();; 

    if (c_id != null)
    {
        set_data(c_id)  
    }
}, 10000)

}); 

</script>

</head>
<body>

<?php // menu bar
    require_once('menu.inc.php');

    print menu($menu_items, 'cmap.php');
?>

<div id="add-form" title="Создать новый контроллер">
    <form id="post-form" enctype="multipart/form-data" action="cmap.php" method="post" class="FormGrid">

        <table id = "FormTable">
         <tr id="FormRow">
          <td id="FormTD">
            <label for="group">Группа</label>
          </td>
          <td id="FormTD">  
            <select name="group" id="group" size="1" class="FormElement ui-widget-content ui-corner-all"> </select>
          </td>
         </tr>

         <tr id="FormRow">
          <td id="FormTD">
           <label for="location">Расположение</label>
          </td>
          <td id="FormTD">  
           <input type="text" name="location" id="email" value="" class="FormElement ui-widget-content ui-corner-all" />
          </td>
         </tr>

        <tr id="FormRow">
         <td id="FormTD">
          <label for="file">Проект (.pdk)</label>
         </td>
         <td id="FormTD">   
          <input type="file" name="file" id="file" value="" class="FormElement ui-widget-content ui-corner-all"/>
         </td>
        </tr>

        </table>

        <input type="hidden" name="action" value="_add"/>
        <input type="hidden" name="c_id" value="-1" />
    </form>
</div>

<div id="main-box">
    <table id="list"></table> 
    <div id="button-box">   
        <button id="add-button">Новый</button>
        <button id="edit-button">Редактировать</button> 
        <button id="remove-button">Удалить</button>
    </div>
</div>

<div id="down-box">
    <div id="con-info-table-div">

    <table id="con-info-table" cellspacing="0">
    <tr><th id="first"></th><th id="loaded">Загружена</td><th>Активирована</th></tr>
        <tr><td id="head">Программа</td><td id="load-date"></td><td id="active-date"></td></tr>
        <tr><td id="head">Текущий ключ</td><td id="cur-key" colspan="2"></td></tr>
        <tr><td id="head">Ключ программы</td><td id="next-key" colspan="2"></td></tr>
        <tr><td id="head">Предыдущий ключ</td><td id="prev-key"colspan="2"></td></tr>
        <tr><td id="head">Статус контроллера</td><td id="con-state"colspan="2"></td></tr>
    </table>
    </div>

    <input type="hidden" name="cont_id" value=""/>  
    <div id="button-box">
        <button id="load-button">Загрузить программу</button>   
        <button id="set-time-button">Установить время</button>
    </div>
</div>


</body>
</html>